package ec.edu.uce.tour.dao.crud;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import ec.edu.uce.tour.dao.util.ParametroSentencia;
import ec.edu.uce.tour.excepcion.AccesoDatosExcepcion;
import ec.edu.uce.tour.excepcion.UceTourException;

/**
 * 
 * @author
 * Interfaz que abstrae el acceso a datos 
 * @param <T> Object
 */
public interface AccesoDatos<T> {

	/**
	 * Metodo que realizara la operacion de persistir el objeto
	 * @param entity entidad que se persistira
	 * @throws AccesoDatosExcepcion
	 */
	public void guardar(T entity) throws AccesoDatosExcepcion;
	
	/**
	 * Metodo que sincronizara una entidad en el EntityManager
	 * @param entity
	 * @throws AccesoDatosExcepcion
	 */
	public void actualizar(T entity) throws AccesoDatosExcepcion;
	
	/**
	 * Metodo que elimina una entidad
	 * @param entity
	 * @throws AccesoDatosExcepcion
	 */
	public void eliminar(T entity) throws AccesoDatosExcepcion;
	
	/**
	 * Metodo que devolvera un objeto segun su clave primaria
	 * @param entity
	 * @param id
	 * @return T
	 * @throws AccesoDatosExcepcion
	 */
	public T buscarPorId(Class<T> entity, Serializable id) throws AccesoDatosExcepcion;
	
	/**
	 * Devuelve todos los registros de esa entidad
	 * @param entity
	 * @return
	 * @throws AccesoDatosExcepcion
	 */
	public List<T> buscarTodo(Class<T> entity) throws AccesoDatosExcepcion;
	
	/**
	 * Metodo que buscar por query 
	 * 
	 * @param queryAnonymous
	 * @return
	 * @throws AccesoDatosExcepcion
	 */
	public Collection<T> buscarPorQuery(String queryAnonymous) throws AccesoDatosExcepcion;
	
	/**
	 * 
	 * @param queryAnonymous
	 * @param isNamed
	 * @return
	 * @throws AccesoDatosExcepcion
	 */
	public Collection<T> buscarPorQuery(String queryAnonymous, Boolean isNamed) throws AccesoDatosExcepcion;
	
	
	/**
	 * 
	 * @param queryAnonymous
	 * @param numRows
	 * @param isNamed
	 * @return
	 * @throws AccesoDatosExcepcion
	 */
	public Collection<T> buscarPorQuery(String queryAnonymous, Boolean isNamed, Integer numRows) throws AccesoDatosExcepcion;
	
	/**
	 * 
	 * @param queryAnonymous
	 * @param isNamed
	 * @param numRows
	 * @param parameterQueries
	 * @return
	 * @throws AccesoDatosExcepcion
	 */
	public Collection<T> buscarPorQuery(String queryAnonymous, Boolean isNamed, Integer numRows, ParametroSentencia ... parameterQueries) throws AccesoDatosExcepcion;
	
	
	
	public T buscarObjetosParametro(String queryAnonymous) throws UceTourException;
	
	
	public T buscarObjetosParametro(String queryAnonymous, Boolean isNamed) throws UceTourException;
	
	
	public T buscarObjetosParametro(String queryAnonymous, Boolean isNamed, ParametroSentencia... parametroSentencias) throws UceTourException;
	
}
